'''
对于多元线性回归，我的理解大概是，多元线性回归大致是分析一个因素，与其他相关因素对其的影响，来进行预测该因素的走向情况，或者分析其相关因素谁是影响其的最主要因素。

多元线性回归是一个可以广泛使用的公式，在生活中的很多方面都可以应用，很多生活情况都可以通过这个公式来分析，比如房价，车价等等。
'''
from sklearn.model_selection import train_test_split #这里是引用了交叉验证
from sklearn.linear_model import LinearRegression  #线性回归
from sklearn import metrics
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import matplotlib as mpl   #显示中文


def mul_lr():   #续前面代码
    pd_data = pd.read_excel('整合数据6.0.xlsx')
    pd_data.index = pd_data['时间']

    pd_data = pd_data.drop(columns=['时间'])
    print(pd_data[['普通本专科毕业生数(万人)','各类学校教育经费事业收入(万元)','高等学校研究与试验发展机构数(个)','国内生产总值(亿元)']])
    '''
    #找出有缺失值的行  data[["国内生产总值(亿元)"]].isnull().T.any().values
    def knm(df,n,name):
        #找出缺失值的行
        temp = df.isnull().T.any().values
        temp_df = df.copy()
        for i in range(len(temp)):
            if temp[i] == True:
                if i < n-1:                  #前n个
                     temp_df.loc[i,name] = df.loc[i:i+n,name].mean()
                elif i > len(temp) - 1 -n:     #后n个
                     temp_df.loc[i,name] = df.loc[i-n:i,name]
                else:
                     print(df.loc[i-n:i+n,name])
                     temp_df.loc[i,name] = df.loc[i-n:i+n,name].mean()
                     print(i-n,i+n+1)
        return temp_df
    not_miss = knm(pd_data[["教育经费(万元)"]],2,"教育经费(万元)")
    pd_data["教育经费(万元)"] = not_miss.values
    '''
    #剔除日期数据，一般没有这列可不执行，选取以下数据http://blog.csdn.net/chixujohnny/article/details/51095817
    # X=pd_data.loc[:,('居民人均消费支出(元)','居民人均可支配收入(元)','教育经费(万元)','国家财政性教育经费(万元)A','研究生毕业生数(万人)A','技术市场成交额(亿元)A','进出口总额(人民币)(亿元)','工业企业利润总额(亿元)A','劳动力(万人)','年末总人口(万人)A')]
    X=pd_data.loc[:,('普通本专科毕业生数(万人)','各类学校教育经费事业收入(万元)','高等学校研究与试验发展机构数(个)','劳动力(万人)','居民人均消费支出(元)','进出口总额(人民币)(亿元)','工业企业利润总额(亿元)','年末总人口(万人)')]
    # '人均能源生产量(千克标准煤)'
    y=pd_data.loc[:,'国内生产总值(亿元)']
    X_train,X_test, y_train, y_test = train_test_split(X,y,test_size = 0.7,random_state=10000)
    print('X_train.shape={}\n y_train.shape ={}\n X_test.shape={}\n,  y_test.shape={}'.format(X_train.shape,y_train.shape, X_test.shape,y_test.shape))
    linreg = LinearRegression()
    model = linreg.fit(X_train, y_train)
    print(model)
    # 训练后模型截距
    print('训练后模型截距')
    print(linreg.intercept_)
    # 训练后模型权重（特征个数无变化）
    print('训练后模型权重')
    print(linreg.coef_)
    font = {
        "family": "Microsoft YaHei"
    }
    mpl.rc("font", **font)
    mpl.rcParams['axes.unicode_minus'] = False
    sns.pairplot(pd_data, x_vars=['普通本专科毕业生数(万人)','各类学校教育经费事业收入(万元)','高等学校研究与试验发展机构数(个)','劳动力(万人)'], y_vars='国内生产总值(亿元)', kind="reg", size=5, aspect=0.7)
    sns.pairplot(pd_data,x_vars=['居民人均消费支出(元)','进出口总额(人民币)(亿元)','工业企业利润总额(亿元)','年末总人口(万人)'],y_vars='国内生产总值(亿元)', kind="reg", size=5, aspect=0.7)
    plt.show()
    # 预测
    y_pred = linreg.predict(X_test)
    print('预测结构')
    print(y_pred)  # 10个变量的预测结果

    # 评价
    # (1) 评价测度
    # 对于分类问题，评价测度是准确率，但这种方法不适用于回归问题。我们使用针对连续数值的评价测度(evaluation metrics)。
    # 这里介绍3种常用的针对线性回归的测度。
    # 1)平均绝对误差(Mean Absolute Error, MAE)
    # (2)均方误差(Mean Squared Error, MSE)
    # (3)均方根误差(Root Mean Squared Error, RMSE)
    # 这里我使用RMES。

    sum_mean = 0
    for i in range(len(y_pred)):
        sum_mean += (y_pred[i] - y_test.values[i]) ** 2
    sum_erro = np.sqrt(sum_mean / 10)  # 这个10是你测试级的数量
    # calculate RMSE by hand
    print("RMSE by hand:", sum_erro)
    # 做ROC曲线
    plt.figure()
    plt.plot(range(len(y_pred)), y_pred, 'b', label="predict")
    plt.plot(range(len(y_pred)), y_test, 'r', label="test")
    plt.legend(loc="upper right")  # 显示图中的标签
    plt.xlabel("the number of sales")
    plt.ylabel('value of sales')
    plt.show()

mul_lr()
